﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConfigurationManager.Model
{
    public class InteligenceModule
    {
        /// <summary>
        /// Id do InteligenceModule
        /// </summary>
        public int Id
        {
            get;
            set;
        }
        /// <summary>
        /// Name do InteligenceModule
        /// </summary>
        public string Name
        {
            get;
            set;
        }
        /// <summary>
        /// Description do InteligenceModule
        /// </summary>
        public string Description
        {
            get;
            set;
        }
        /// <summary>
        /// Classe do InteligenceModule
        /// </summary>
        public string Class
        {
            get;
            set;
        }
        /// <summary>
        /// Assembly do InteligenceModule
        /// </summary>
        public string Assembly
        {
            get;
            set;
        }

        public static List<InteligenceModule> Retrieve()
        {
            DataAccess.InteligenceModule im = new DataAccess.InteligenceModule();
            return im.Retrieve();
        }

        public static void Delete(int inteligenceModuleId)
        {
            VerifyDependencies(inteligenceModuleId);

            DataAccess.InteligenceModule im = new DataAccess.InteligenceModule();
            im.Delete(inteligenceModuleId);
        }

        private static void VerifyDependencies(int inteligenceModuleId)
        {
            DataAccess.Process process = new ConfigurationManager.DataAccess.Process();
            int count = process.CountByInteligenceModule(inteligenceModuleId);
            if (count > 0)
                throw new ValidationException("O inteligence module não pode ser excluído pois possui processos associados. Para excluir o inteligence module, exclua antes o processos associados.");
        }

        public static void Save(InteligenceModule inteligenceModule)
        {
            if (string.IsNullOrEmpty(inteligenceModule.Name))
                throw new ValidationException("O nome do inteligence module deve ser informado.");
            else if (inteligenceModule.Name.Length > 50)
                throw new ValidationException("O nome do inteligence module deve ter no máximo 50 caracteres.");

            if (string.IsNullOrEmpty(inteligenceModule.Description))
                throw new ValidationException("A descrição do inteligence module deve ser informada.");
            else if (inteligenceModule.Description.Length > 120)
                throw new ValidationException("A descrição do inteligence module deve ter no máximo 120 caracteres.");

            if (string.IsNullOrEmpty(inteligenceModule.Assembly))
                throw new ValidationException("O assembly do inteligence module deve ser informado.");
            else if (inteligenceModule.Assembly.Length > 250)
                throw new ValidationException("O nome do assembly do inteligence module deve ter no máximo 250 caracteres.");

            if (string.IsNullOrEmpty(inteligenceModule.Class))
                throw new ValidationException("A classe do inteligence module deve ser informada.");
            else if (inteligenceModule.Class.Length > 250)
                throw new ValidationException("O nome do classe do inteligence module deve ter no máximo 250 caracteres.");

            DataAccess.InteligenceModule p = new DataAccess.InteligenceModule();
            p.Save(inteligenceModule);
        }
    }
}
